#pragma once
#include <iostream>
#include <string>
#include <memory>
#include <sstream>
#include <json/json.h>

class json_util
{
public:
    //序列化:Json对象 -> 字符串
    //输入输出型参数
    //root输入参数:表示要序列化的json对象
    //str输出参数:表示序列化之后的字符串
    static bool serialize(const Json::Value &root, std::string &str)
    {
        Json::StreamWriterBuilder swb;
        std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());

        std::stringstream ss;
        int ret = sw->write(root, &ss);
        if(ret != 0)
        {
            std::cout << "Serialize failed!" << std::endl;
            return false;
        }

        str = ss.str();
        return true;
    }

    //反序列化:字符串->Json对象
    //输入输出型参数
    //str输入参数:表示需要反序列化的字符串
    //root输出参数:表示反序列化后的json对象
    static bool unserialize(const std::string &str,Json::Value &root)
    {
        Json::CharReaderBuilder crb;
        std::unique_ptr<Json::CharReader> cr(crb.newCharReader());

        bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), &root, nullptr);
        if(!ret)
        {
            std::cout << "UnSerialize failed!" << std::endl;
            return false;
        }
        return true;
    }
};
